package com.swing_pinea;

import com.swing_pinea.event.PineaEvent;
import com.swing_pinea.render.PineaImage;
import com.swing_pinea.shape.PineaRect;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// 导入 Pinea 引擎核心类的静态方法
import static com.swing_pinea.core.Pinea.*;

public class Main {

    long startTime; // 记录程序启动时间，用于动画帧计算

    // 构造方法：初始化游戏窗口
    public Main() {
        pineaInit("PineaSwingTest", 800, 600); // 初始化窗口，标题和尺寸
        startTime = System.currentTimeMillis(); // 记录启动时间
        init(); // 初始化游戏资源
    }

    // 游戏主循环
    public void run() {
        PineaEvent event = new PineaEvent(); // 事件对象，用于处理输入

        // 时间控制变量，用于稳定帧率
        long lastTime = System.nanoTime();
        long accTime = 0;
        long currentTime;
        long deltaTime = 1000_000_000 / 60; // 60FPS 的每帧纳秒数
        float deltaTimeF = 1f / 60f; // 每帧的时间（秒）

        pineaShow(); // 显示窗口
        boolean running = true;
        while (running) { // 主循环
            // 处理事件队列
            while (pineaPollEvent(event)) {
                if (event.type == PINEA_EVENT_QUIT) { // 窗口关闭事件
                    running = false;
                } else if (event.type == PINEA_EVENT_KEY_DOWN) { // 按键按下
                    Input.update(event.key, true);
                } else if (event.type == PINEA_EVENT_KEY_UP) { // 按键释放
                    Input.update(event.key, false);
                }
            }

            // 帧率控制：固定 60FPS 更新
            currentTime = System.nanoTime();
            accTime += currentTime - lastTime;
            lastTime = currentTime;
            if (accTime >= deltaTime) {
                while (accTime >= deltaTime) {
                    accTime -= deltaTime;
                    update(deltaTimeF); // 更新游戏逻辑
                }
                render(); // 渲染画面
                pineaRender(); // 提交渲染
            }
        }

        pineaQuit(); // 退出游戏
    }

    // 游戏资源
    PineaImage bgImage; // 背景图片
    Map<String, List<PineaImage>> playerAnimations; // 玩家动画集合（状态 -> 帧列表）
    PineaRect playerPosition; // 玩家位置和大小
    String playerState; // 玩家当前状态（idle/run/jump）
    boolean flipX; // 玩家是否水平翻转

    // 初始化游戏资源
    private void init() {
        bgImage = pineaLoadImage("assets/images/bg.png"); // 加载背景图

        // 加载玩家图片并切割动画帧
        PineaImage playerImage = pineaLoadImage("assets/images/mario.png");
        playerAnimations = new HashMap<>();
        // idle动画帧
        playerAnimations.put("idle", Arrays.asList(
                playerImage.crop(16 * 6, 16 * 2, 16, 16).scale(2.68f, 2.68f)
        ));
        // idle（ flip）动画帧
        playerAnimations.put("flip_idle", Arrays.asList(
                playerImage.crop(16 * 6, 16 * 2, 16, 16).scale(2.68f, 2.68f).flip(true, false)
        ));
        // 跑步动画帧
        playerAnimations.put("run", Arrays.asList(
                playerImage.crop(16 * 0, 16 * 2, 16, 16).scale(2.68f, 2.68f),
                playerImage.crop(16 * 1, 16 * 2, 16, 16).scale(2.68f, 2.68f),
                playerImage.crop(16 * 2, 16 * 2, 16, 16).scale(2.68f, 2.68f)
        ));
        // 跑步（ flip）动画帧
        playerAnimations.put("flip_run", Arrays.asList(
                playerImage.crop(16 * 0, 16 * 2, 16, 16).scale(2.68f, 2.68f).flip(true, false),
                playerImage.crop(16 * 1, 16 * 2, 16, 16).scale(2.68f, 2.68f).flip(true, false),
                playerImage.crop(16 * 2, 16 * 2, 16, 16).scale(2.68f, 2.68f).flip(true, false)
        ));
        // 跳跃动画帧
        playerAnimations.put("jump", Arrays.asList(
                playerImage.crop(16 * 4, 16 * 2, 16, 16).scale(2.68f, 2.68f)
        ));
        // 跳跃（ flip）动画帧
        playerAnimations.put("flip_jump", Arrays.asList(
                playerImage.crop(16 * 4, 16 * 2, 16, 16).scale(2.68f, 2.68f).flip(true, false)
        ));

        playerState = "idle"; // 初始状态为 idle
        playerPosition = new PineaRect(0, 0, 0, 0); // 初始位置
    }

    // 更新游戏逻辑
    private void update(float deltaTimeF) {
        playerState = "idle"; // 默认状态为 idle

        // 根据按键更新玩家状态和位置
        if (Input.isKeyPressed(PINEA_KEY_A)) { // 左移
            playerPosition.x -= 250.f * deltaTimeF;
            playerState = "run";
            flipX = true;
        }
        if (Input.isKeyPressed(PINEA_KEY_D)) { // 右移
            playerPosition.x += 250.f * deltaTimeF;
            playerState = "run";
            flipX = false;
        }
        if (Input.isKeyPressed(PINEA_KEY_W)) { // 上移
            playerPosition.y -= 250.f * deltaTimeF;
            playerState = "run";
        }
        if (Input.isKeyPressed(PINEA_KEY_S)) { // 下移
            playerPosition.y += 250.f * deltaTimeF;
            playerState = "run";
        }
        if (Input.isKeyPressed(PINEA_KEY_SPACE)) { // 跳跃
            playerState = "jump";
        }
        // 如果翻转，后续就播放翻转动画
        if (flipX) {
            playerState = "flip_" + playerState;
        }
    }

    // 渲染画面
    private void render() {
        pineaDrawImage(bgImage, 0, 0); // 绘制背景

        // 根据当前状态获取动画帧列表
        List<PineaImage> pineaImages = playerAnimations.get(playerState);
        // 计算当前应该显示的帧索引（基于运行时间）
        long spendTime = System.currentTimeMillis() - startTime;
        int index = (int) spendTime / 100 % pineaImages.size();
        // 绘制玩家当前帧
        pineaDrawImage(pineaImages.get(index), playerPosition.x, playerPosition.y);
    }

    // 程序入口
    public static void main(String[] args) {
        new Main().run();
    }
}